home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
kowin
/
archive
/
sys
/
kowin14d.lzh
/
doc
/
library
/
dbserv.doc
< prev
next >
Wrap
Text File
|
1993-02-10
|
9KB
|
290 lines
X68000 Ko-Window データベースサーバー
dbserv v1.20
1993 2/10 小笠原博之
Ko-Window にはもともと WSRV.RC と WSRV.RS によるリソースを持っています。こ
のプログラムもそれと同様に、ウィンドウ上のデータを共通で管理するのが目的です。
リソースと異なるのは以下の3点です。
アプリケーションレベルでの実現
バイナリデータの共有化が目的である
動的に読み込むデータの管理レベルを持っている
例えば hide さんのトランプのカードデータを共有化することができれば、非常に
効率が良くなるでしょう。
●ファイル構成
dbserv.doc このファイル
dbserv.win データベースサーバー
dbstat.win サーバーの状態を表示するユーティリティ
dbslib.a ライブラリ
dbslib.h ライブラリのヘッダファイル
db_smpl.c dbslib を使ったサンプルプログラムです
smpl.kdb db_smpl.c によるサンプル共有データ
dbsrc.lzh ソース一式
●サーバーの起動
dbserv [-m<num>]
通常はそのまま実行してかまいません。設定に従い、static であれば即データを
読み込みます。サーバーのエラーは Console に出力します。
サーバーはメモリに常駐するので、解除するには Command.win の kill コマンド
等を使って下さい。
起動時に、-m オプションでデータ管理テーブルの個数を指定することができます。
デフォルトは 32 です。
注意: static データの読み込みエラーは dbserv が出力しますが、dynamic データの
エラー出力は、アプリケーションに依存することになります。
● WSRV.RC の設定
WSRV.RC の !DBserv に、予めサーバーがロードするデータファイルを記述してお
くことができます。データを dynamic でのみ使用する場合には、特にこの設定は必
要ありません。サーバーを常駐させるだけで OK です。
---- <例> ------------------------------------------------------------------
!DBserv
CardColor 0 static cards.kdb
CardMono 0 dynamic cardsmono.kdb
----------------------------------------------------------------------------
記述は1データあたり1行、それぞれ4項目で、以下のようになっています。
[データ名] [オプション番号] [管理レベル] [データファイル名]
======== ============== ========== ================
データ名 :アプリケーション側からのデータアクセスは、全部このデータ名
======== によって行なわれます。(最大15byte) 大文字小文字を区別します。
オプション番号 :必ず 0 を指定しておいて下さい。ユーザー側から参照できますが
============== 現在未使用です。
管理レベル : 以下の2種類があります。
==========
static : サーバー起動時にデータを読み込み、データは常
にメモリ上に保持されます。
dynamic: アプリケーションからのアクセス要求があって初
めてメモリ上に読み込みます。アクセスするアプ
リケーションがなくなると、勝手にメモリを開放
します。
この管理レベルとはサーバー内部の扱い方の違いだけなので、アプ
リケーションから見た場合、どちらでも全く同じようにアクセスし
て用いることができます。
データファイル名:そのデータのファイル名そのものを書いて下さい。パス名は必要あ
================ りません。データファイルの検索は、以下の順番で行なわれます。
・環境変数 DBSERV が設定されている時
1. 環境変数 DBSERV に設定してあるパス名
(パス名の最後には必ず"/"が必要)
2. dbserv.win と同じディレクトリ
・環境変数 DBSERV が設定されていない時
1. カレントディレクトリ
2. dbserv.win と同じディレクトリ
注意!! 環境変数 DBSERV が定義されている場合はカレントディレクトリを検索し
ないことに注意して下さい。(不要なディスクアクセスを行なわないためです)
注意!! データファイル名は必ずファイル名だけ書いて下さい。(パスは書かない)
●データベースへのアクセス
ユーザーアプリケーションから、データベースへアクセスする方法を説明します。
付属のライブラリ dbslib.a とヘッダファイル dbslib.h を使います。
void *DBOpen( name )
char *name;
データベースへのアクセスを宣言します。name は、アクセスを希望するデー
タベース名へのポインタです。見つからない場合は NULL を返します。
戻り値はそのデータ領域へのポインタで、データファイルを読み込んだその
先頭に相当します。データ構造へは一切関与しませんので、利用者側で対処
して下さい。
void DBClose( name )
char *name;
データベースへのアクセスを終了します。アクセスをやめる時は、必ずこれ
を呼び出して下さい。
int DBOption( name )
char *name;
WSRV.RC の !DBserv でのオプション番号を返します。現在特に意味を持ち
ません。DBOpen() しなくてもこの関数を使用することができます。
int DBAddTable( name, option, level, file )
char *name;
int option; WSRV.RC の !DBserv のオプション番号に相当する
int level; 管理レベル、現在は DBDynamic のみ使用可能
char *file; 登録するデータのファイル名
サーバーの管理テーブルに、アプリケーション側からデータの追加を行ない
ます。もし同じ名前のデータがすでに登録されている時は何もしません。各
アプリケーションが、DBOpen() する前にこのファンクションを呼び出すこ
とで、WSRV.RC への設定追加の手間を軽減させることができます。ただし、
現在アプリ側で追加できるデータは dynamic に限ります。
すでに定義されていたなど、登録に失敗すると FALSE を返します。ただし、
ここでのエラーチェックは省いて、その後の DBOpen() 時のみ確認するよう
にしても構いません。
DBAddTable( "Cards", 0, DBDynamic, "Cards.kdb" )
int DBUserCheck( info )
EventInfo *info;
EventUser で使用するライブラリです。データベースサーバーの DBkill コ
マンドの判定を行ないます。もし DBkill なら TRUE、それ以外の EventUser
なら FALSE を返します。これはサーバー呼び出しはしません。
通常は、EventUser の最初でこの関数を呼び出し、もし TRUE が返ってきた
らアプリケーションを即座に終了させることになるでしょう。この終了時は
DBClose() 等のサーバーコールを行なってはいけません。
●データの使用方法
一度 DBOpen() でデータのポインタを獲得しておき、後はそのポインタに従って自
由にアクセスを行なって下さい。1つのアプリケーションで、多数のデータへアクセ
スを行なってもかまいません。ただし、データをアプリケーション側で書き換えては
いけません。DBOpen() したデータは、必ず DBClose() する必要があります。
DBOpen() に失敗した時はデータアクセスができませんから、必ず戻り値をチェッ
クし、必要ならエラー終了させるようにして下さい。(この場合もすでに DBOpen()
しているものは DBClose() させることを忘れないように)
アプリケーション終了時には必ずすべてのデータを DBClose() するようにして下
さい。
ポインタアクセスが前提なので、頻繁にアクセスされるデータを毎回 DBOpen() す
るのは好ましくありません。(例えば EventRedraw のたびに DBOpen() & DBClose()
を行なうなど)EventOpen 等でデータを開いて先にポインタを獲得しておいて下さい。
ですが、さほど重要でないデータを一時的にアクセスする場合においては、DBOpen()
と DBClose() をペアにしたアクセスが可能です。イベント開放をはさまなければ、
この場合 EventUser によるデータ破棄のチェックを行なう必要がありません。
●データ破棄のチェック
データはポインタアクセスですから、イベントの切れ目では先にサーバーが終了し
てしまう可能性があります。その場合はもちろん、アクセス先のデータがなくなり、
不都合が起こることになります。
Console では、これを避けるためにイベント毎に ConsoleOpen() を走らせてチェッ
クしています。データベースアクセスの場合は、いちいちチェックを行うのはたいへ
んですから、EventUser を使用することにしました。
サーバーは、kill による終了時など、アクセスされているデータがあるにもかかわ
らずデータを開放しなければならない場合に、以下のイベントをすべてのプロセスに
発生させます。
info->optiono = EventUser;
info->ComData = 'DBsv';
info->ComBuffer= コマンド
info->ComBuffer には UserStrings と同様 char ** が入り、サーバーからのコマ
ンドが入ります。現在以下のコマンドが定義されています。
info->ComBuffer = {"DBkill"}
アクセスされているデータがあるにもかかわらず、全部のデータを強制破棄
することを意味します。dbserver が killされた場合など。アクセスされて
いるデータがない場合にはこのイベントは発生しません。
info->ComBuffer = {"DBdel", データ名 .. , NULL }
アクセスされている特定のデータを強制破棄することを意味します。ただし、
管理レベルが static のデータは、DBkill 以外で破棄されることはありませ
ん。アクセスされていないデータが破棄される場合には、このイベントは発
生しません。(注: 現在のサーバーは、このコマンドを発生させることはあ
りません)
そのデータの破棄が送られてきた場合は、もしアクセス中であってもそのデータを
DBClose() する必要はありません。
カードゲーム等、DBkill によってパターンデータがアクセス不可能になった場合
は、アプリケーションとしての実行が不可能になります。よって実質上この DBkill
コマンドは、アプリケーションに対する強制終了命令といえるでしょう。
●データの作成
サーバーが扱うデータは、特に圧縮等は行なわずそのままメモリ上に読み込みます。
データサイズは今のところアプリケーション側から知る手段はありませんので、デー
タやアプリケーション側で対処して下さい。
作成したデータを公開する場合は、それをアクセスするための構造を記述した、C
言語ヘッダファイル等を用意するのが好ましいでしょう。アクセス用のライブラリを
作る等はすべてサーバー利用者にお任せします。
●サーバーの状態表示ユーティリティ
付属の dbstat.win は、サーバーの管理テーブルの状態を Console に出力します。
起動オプションはありません。デバッグに役立てて下さい。
●注意
まだ実験段階で、仕様は今後も修正されていく可能性があります。特に構造体内容
が修正される可能性があるため、必ずライブラリを通し、直接管理テーブルをたどる
ようなアクセスは控えて下さい。
●配布
プログラム部の著作権は作者が保持します。gcc コンパイルされ、XC v1、gnulib.a
wlib.a のライブラリを含んでいます。このプログラムの配布、利用は自由です。
●連絡先
oga@dgw.yz.yamagata-u.ac.jp
DenDen-NET: DEN0006 COR.
SPS-NET: SPS0783 COR.